package org.atlantis.netty.discard;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;

public class DiscardServer {

	public static void main(String[] args) {
		/*
		 * ChannelFactory是一个创建并管理Channel的工厂类。它处理所有的IO请求，并将IO转换为ChannelEvent事件。
		 * netty提供了很多不同的ChannelFactory的实现。这里我们使用的是NioServerSocketChannelFactory，
		 * 但是需要注意的是NioServerSocketChannelFactory不会自己去创造处理IO的线程，它是从我们提供的线程池中获取
		 * 线程。
		 */
		ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),
				Executors.newCachedThreadPool());
		/*
		 * ServerBootstrap是一个用于启动服务的帮助类。我们也可以直接通过Channel的bind方法直接来启动服务，但是这样
		 * 控制起来很麻烦，在大多数情况下我们不需要直接通过Channel来启动，而推荐使用ServerBootstrap。
		 */
		ServerBootstrap bootstrap = new ServerBootstrap(factory);
		// 设置pipeline，pipeline就相当于Mina中的Filter，使用责任链模式来处理接受/发送的数据。
		bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
			@Override
			public ChannelPipeline getPipeline() throws Exception {
				return Channels.pipeline(new DiscardServerHandler());
			}
		});
		bootstrap.bind(new InetSocketAddress(8081));
	}
}
